﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Xml.Linq;
using System.Threading;
using System.Speech.Recognition;

namespace MBO_PIM
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public Window terminAnlegenFenster = new Window();
        public Window terminBearbeitenFenster = new Window();
        public Window terminAnzeigenFenster = new Window();
        public Window Hilfe;
        public Sprachausgabe voiceOutput;

        public SpeechRecognitionEngine recognizer;
        public MainWindow()
        {
            InitializeComponent();
            Hilfe = new Hilfe(this);
            voiceOutput = new Sprachausgabe();

            sprachausgabeHeute();

            // Spracheingabe
            recognizer = new SpeechRecognitionEngine();
            recognizer.SetInputToDefaultAudioDevice();
            Grammar grammar = new Grammar("..\\..\\grammar.xml", "thema");
            recognizer.UnloadAllGrammars();
            recognizer.LoadGrammar(grammar);

            try
            {
                recognizer.RecognizeAsync(RecognizeMode.Multiple);
            }
            catch
            {
            }

            recognizer.SpeechRecognized += (s, e1) =>
            {

                string text = e1.Result.Text;
                Console.WriteLine("Spracheingabe: " + text);

                if (text.Equals("Hilfe aufrufen"))
                {
                    Hilfe.Show();
                }
                if(text.Equals("Programm beenden")){
                    System.Environment.Exit(0);
                }
                if (text.Equals("Termin anlegen"))
                {
                    TerminAnlegen();
                }
                if (text.Equals("Termin bearbeiten"))
                {
                    //TerminBearbeitenAnzeigen();
                }
                if (text.Equals("Termine auflisten"))
                {
                    TermineAnzeigen();
                }
                if (text.Equals("Aktuelles Datum"))
                {
                    sprachausgabeHeute();
                }
                if (text.Equals("Monat vor"))
                {
                    kalender.DisplayDate = new DateTime(kalender.DisplayDate.Year, kalender.DisplayDate.Month + 1, kalender.DisplayDate.Day);
                }
                if (text.Equals("Monat zurück"))
                {
                    kalender.DisplayDate = new DateTime(kalender.DisplayDate.Year, kalender.DisplayDate.Month - 1, kalender.DisplayDate.Day);
                }
                if (text.Equals("Fenster schließen"))
                {
                    if (terminBearbeitenFenster.IsActive) terminBearbeitenFenster.Hide();
                    if (terminAnlegenFenster.IsActive) terminAnlegenFenster.Hide();
                    if (terminAnzeigenFenster.IsActive) terminAnzeigenFenster.Hide();
                    if (Hilfe.IsActive) Hilfe.Hide();
                }



            };


        }

        private void MenuItem_Click(object sender, RoutedEventArgs e)
        {
            TerminAnlegen();
        }

        private void MenuItem_Click_1(object sender, RoutedEventArgs e)
        {
            TermineAnzeigen();
        }

        public void TerminAnlegen()
        {
            // selektiertes Datum zum übergeben ans nächste Fenster
            // falls nicht selektiert wurde, wird das aktuelle Datum übergeben
            DateTime datum;
            try
            {
                datum = (DateTime)kalender.SelectedDate;
            }
            catch
            {
                datum = DateTime.Now;
            }

            terminAnlegenFenster = new NeuerTermin(datum, this);
            terminAnlegenFenster.Show();
        }

        public void TermineAnzeigen()
        {
            terminAnzeigenFenster = new TermineAnzeigen(this);
            terminAnzeigenFenster.Show();
        }

        public void TerminBearbeitenAnzeigen(XElement elem)
        {
            terminBearbeitenFenster = new TerminBearbeiten(elem, this);
            terminBearbeitenFenster.Show();
        }

        private void kalender_DisplayDateChanged(object sender, CalendarDateChangedEventArgs e)
        {
            // Sprachausgabe
            Thread thread = new Thread(new ParameterizedThreadStart(voiceOutput.SayString));
            thread.Start(kalender.DisplayDate.ToString("MMMM"));
        }

        public void sprachausgabeHeute()
        {
            // Sprachausgabe
            Thread thread = new Thread(new ParameterizedThreadStart(voiceOutput.SayString));
            thread.Start("Today is " + DateTime.Today.ToString("MMMM dd, yyyy") + ".");
        }

        public Sprachausgabe getSprachausgabe()
        {
            return this.voiceOutput;
        }

        private void MenuItem_Click_2(object sender, RoutedEventArgs e)
        {
            Hilfe = new Hilfe(this);
            Hilfe.Show();
        }

        private void canvas_StrokeCollected(object sender, InkCanvasStrokeCollectedEventArgs e)
        {
            
            GestenFrame gframe= new GestenFrame(e.Stroke);

            //Thread thread = new Thread(new ParameterizedThreadStart(voiceOutput.SayString));
            //thread.Start("Today is " + DateTime.Today.ToString("MMMM dd, yyyy") + ".");

            string berechneteGeste = LevenshteinMatrix.getInstance().calculate(gframe.berechneteGeste);
            canvas1.Strokes.Clear();

            if (berechneteGeste == null)
            {
                label1.Content = "Unbekannte Geste";
                return;
            }
            else if (berechneteGeste == Gesten.T_ANLEGEN)
            {
                TerminAnlegen();
                label1.Content = "Geste = Termin anlegen";
            }
            else if (berechneteGeste == Gesten.T_LISTE)
            {
                TermineAnzeigen();
                label1.Content = "Geste = Termine auflisten";
            }
            else if (berechneteGeste == Gesten.HILFE)
            {
                Hilfe.Show();
                label1.Content = "Geste = Hilfe";
            }
            else if (berechneteGeste == Gesten.MONAT_VOR)
            {
                if (kalender.DisplayDate.Month == 12)
                {
                    kalender.DisplayDate = new DateTime(kalender.DisplayDate.Year + 1, 1, kalender.DisplayDate.Day);
                }
                else
                {
                    kalender.DisplayDate = new DateTime(kalender.DisplayDate.Year, kalender.DisplayDate.Month + 1, kalender.DisplayDate.Day);
                }
                label1.Content = "Geste = Monat vor";

            }
            else if (berechneteGeste == Gesten.MONAT_ZURUECK)
            {
                if (kalender.DisplayDate.Month == 1)
                {
                    kalender.DisplayDate = new DateTime(kalender.DisplayDate.Year - 1, 12, kalender.DisplayDate.Day);
                }
                else
                {
                    kalender.DisplayDate = new DateTime(kalender.DisplayDate.Year, kalender.DisplayDate.Month - 1, kalender.DisplayDate.Day);
                }
                label1.Content = "Geste = Monat zurück";
            }
            else if (berechneteGeste == Gesten.ENDE)
            {
                System.Environment.Exit(0);
                label1.Content = "Geste = ENDE";
            }

        }

        private void myInkCanvas_Gesture(object sender, InkCanvasGestureEventArgs e)
        {

        }
    }
}